# 解决tricks汇总
# 由于原始数据集单张图片都是单一类别，如果直接进行copy-paste会影响数据分布，可以用单张图像上的目标进行copy-paste。
# 利用干净背景进行填鸭式，而不是直接应用在原始图片上。
# 冠军方法：纯背景填鸭+yolov5-cbnetv2-bot3+wbf（sinwbf-自研）。
# MMDetection是个好东西，无脑上CBNetV2、Swin Transformer、Cascade RCNN、ConvNeXt、TOOD等框架内方案。


import os
from PIL import Image

# 指定要遍历的文件夹路径
folder_path = 'tmp/train/images/JPEGImages'


# 遍历文件夹中的所有文件
def save_pic(file_path):
    # 加载图片
    image = Image.open(file_path)
    pname = file_path.replace("tmp/train/images/JPEGImages/", "").replace("jpg", "txt")
    with open('tmp/train/labels/JPEGImages/' + pname, 'r') as file:
        white_background = Image.new('RGB', image.size, color=(255, 255, 255))
        # 逐行读取文件内容
        for line in file:
            # 打印每一行内容
            print(line)
            weight = image.size[0]
            h = image.size[1]

            # 假设我们知道要抠图的区域的坐标 (x, y, width, height)
            x = float(line.split(" ")[1]) * weight
            y = float(line.split(" ")[2]) * h
            width = float(line.split(" ")[3]) * weight
            height = float(line.split(" ")[4]) * h

            # 使用crop方法抠图
            cropped_image = image.crop((x - width / 2.0, y - height / 2.0, x + width / 2.0, y + height / 2.0))

            # 如果需要，你可以在这里添加额外的图像处理步骤，比如使用alpha通道进行合成
            # 但在这个例子中，我们直接将抠出的图像粘贴到白色背景上

            # 将抠出的图像粘贴到白色背景上（这里其实并没有替换背景，因为抠图部分已经是从原图裁剪出来的）
            # 如果你的原图像有透明度通道（比如PNG），这里需要特殊处理透明度
            # 假设原图像没有透明度，我们直接粘贴
            white_background.paste(cropped_image, (int(x), int(y)))

    # 保存抠出的图片（现在已经是白色背景了）
    p = file_path.replace("JPEGImages", "JPEGImages2")
    white_background.save(p)
    pass


for filename in os.listdir(folder_path):
    # 获取文件的完整路径
    file_path = os.path.join(folder_path, filename)

    # 判断是否为文件
    if os.path.isfile(file_path):
        # 处理文件
        print(f"文件: {file_path}")
        save_pic(file_path)
        # ...
